package com.erp.util.factroy;

import com.erp.util.proxy.ServiceProxy;

/**
 * @author 工厂类
 * 用于创建Dao数据访问层对象和业务逻辑层对象
 */
public class ObjectFactory {

    /**
     * DAO接口的对象
     *
     * @param className 要实例化的DAO接口对象的类名
     * @param clazz     泛型声明
     * @return 返回DAO的接口对应子类的实例
     */
    public static <T> T getDAOInstance(String className, Class<T> clazz) {
        if (className == null || "".equals(className)) {
            return null;
        }

        try {
            return (T) Class.forName(className).getDeclaredConstructor().newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * Service接口对象
     *
     * @param className 要实例化的Service接口对象的类名
     * @param clazz     泛型声明
     * @return 返回Service接口对应的代理类对象
     */
    public static <T> T getServiceInstance(String className, Class<T> clazz) {
        if (className == null || "".equals(className)) {
            return null;
        }

        try {
            //band()方法返回的是代理类对象,为什么可以转成Service接口类型(T)呢?那是因为代理类对象动态的实现了真实业务的父接口,这是由Java底层自己去实现的
            return (T) new ServiceProxy().band(Class.forName(className).getDeclaredConstructor().newInstance());
        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }
}
